// https://leetcode.cn/problems/implement-queue-using-stacks/submissions/497952717/
// 入栈的时候是先将数据入第一个栈，出栈的时候是，先将第一个栈的数据全部再次放入第二个栈，再取出，因为栈是先进后出，
// 队是先进先出，用两个栈可以实现此功能

class MyQueue {
    private stack1:number[] = [];
    private stack2:number[] = []
    constructor() {}

    push(x: number): void {
        this.stack1.push(x);
    }

    pop(): number {
        // 判断Stack2 中是否有数据,如果有就直接取出，这里添加断言，因为已经进行了if判断
        if (this.stack2.length > 0){
            return this.stack2.pop()!;
        }else if(this.stack1.length > 0){// 如果stack1中有数据
            while(this.stack1.length> 0){// 一直进行while循环，将第stack1中的数据依次取出并追加到第二个栈中
                const item = this.stack1.pop()!;
                this.stack2.push(item);
            }
            // 循环完毕后再将Stack2中最外层的数据取出
            return this.stack2.pop()!;
        }else{
            return -1
        }
    }

    peek(): number {
        // 这个和上面的同理，这个是取出，不删除
        if (this.stack2.length > 0){
            return this.stack2[this.stack2.length - 1];
        }else if(this.stack1.length > 0){
            while(this.stack1.length> 0){
                const item = this.stack1.pop()!;
                this.stack2.push(item);
            }
            return this.stack2[this.stack2.length - 1];
        }else{
            return -1
        }
    }

    empty(): boolean {
        if(this.stack1.length == 0  && this.stack2.length == 0){
            return true;
        }else{
            return false;
        } 
    }
}

